package multiIntro;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import polyglot.ast.Node;
import polyglot.ast.NodeFactory;
import polyglot.ext.jl.ast.Node_c;
import polyglot.types.TypeSystem;
import polyglot.util.Position;
import xaj.xc.ast.NodeXAJ;

// Versão que deve ser compilada/gerado automaticamente
// para a classe sintática Eval

public class Eval extends Node_c implements NodeXAJ, xaj.lang.Map {
	
	/*
	@grammar {
		Eval -> "<%" l = { id = IDENTIFIER | s = STRING_LITERAL} "%>";
	}
	*/
	
	private Map map;
	
	public Eval(Position pos) {
		super(pos);
		this.map = new HashMap();
		System.out.println("Criou um objeto Eval");
	}

	public Object get(String name) {
		return map.get(name);
	}
	

	public boolean add(String name, Object value) {
		if(!map.containsKey(name)) {
			map.put(name, value);
			return true;
		} else
			return false;
	}

	public Iterator iterator() {
		return map.keySet().iterator();
	}

	public void set(String name, Object value) {
		if(map.containsKey(name)) {
			map.keySet();
			map.put(name, value);
		}
	}
	
	//Código que não foi gerado automaticamente
	
	private static String value;
	private static Map entries = new HashMap();
	
	public static String getEvaluetedValue() {
		return value;
	}
	
	public static void put(String name, String value) {
		entries.put(name, value);
	}
	
	public Node desugar(NodeFactory ft, TypeSystem ts) {
		System.out.println("Desugar do Eval");
		xaj.lang.List l = (xaj.lang.List) get("l");
		Iterator it = l.iterator();
		value = "";
		while (it.hasNext()) {
			xaj.lang.Map m = (xaj.lang.Map) it.next();
			if(m.get("s") != null) {
				value += ((polyglot.lex.StringLiteral) m.get("s")).getValue();
			}
			else {
				value += (String) entries.get(((polyglot.lex.Identifier) m.get("id")).getIdentifier());
			}
		}
		return this;
	}
}
